package com.springcloud.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.xml.crypto.dsig.spec.XPathType;

/**
 * @ClassName : AuthFilter
 * @Author : 司猫子
 * @Date: 2021/4/13 0:55
 */
//自定义过滤器用于实现接口安全认证的
//需要继承ZuulFilter抽象服务类
//  注意:
//  当前类必须定义到Spring的应用上下文容器中
@Component
public class AuthFilter extends ZuulFilter {
    //返回过滤器的类型,不同类型的过滤器执行时机不同
    @Override
    public String filterType() {
        //返回pre表示当前过滤器为前置过滤器,会在请求进入远程服务前进行
        return "pre";
    }

    //返回过滤器的需要,当有多个类型过滤器时,返回值越小,优先级越高
    @Override
    public int filterOrder() {
        return 0;
    }

    //是否启动当前过滤器,true表示启用
    @Override
    public boolean shouldFilter() {
        return true;
    }

    //过滤器的具体逻辑处理方法,返回值类型目前版本没有特殊作用,返回nuul即可
    @Override
    public Object run() throws ZuulException {
        int i = 10/0;

        //获取请求上下文对象
        final RequestContext context = RequestContext.getCurrentContext();
        //获取用户请求对象
        final HttpServletRequest request = context.getRequest();
        //获取用户请求中的数据appId(应用身份识别码)
        final String appId = request.getParameter("appId");
        //判断应用身份识别码是否正确,进入if表示身份错误,请求非法
        //注意:实际工作时,应该到数据库或redis中来验证身份识别码是否正确
        if(appId == null || "123".equals(appId)){
            //设置false表示拒绝请求继续向下访问远程服务,要返回响应
            context.setSendZuulResponse(false);
            //设置响应内容类型以及编码格式
            context.addZuulResponseHeader("content-type", "text/html;charset=utf-8");
            //设置响应状态码为401,表示没有权限或身份认证失败,第三方应用将抛出异常,如果不希望抛出异常,则返回200即可
            context.setResponseStatusCode(401);
            //响应的内容
            context.setResponseBody("非法请求");
        }else {
            System.out.println("请求合法");
        }
        System.out.println("---网关执行成功---");


        return null;
    }
}
